//==================================================
//Instituto Tecnologico de Costa Rica
//Principios de Sistemas Operativos 
//Profesora: Ericka Marin 
//Tarea Programada 1
//Integrantes:
//Roland Chaverri
//Gabriel Rodriguez Brenes
//==================================================
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include "mode_FIFO.h"
#include "download_HTML.c"
#include "parser_HTML.c"
#define BUF_SIZE 255
#define PORT 80
#define USERAGENT "HTMLGET 1.0"

char *MAIN_HOST;
/**
 *Modalidad FIFO
 */
/**
 * Descarga la pagina solicitada
 * @param pagina
 */
void iniciar_FIFO(char *pagina)
{
    establecer_host_pagina(pagina);
    
}

void descargar_links(char *link)
{
    PAGE *page;
    page = head;
    
    while(page)
    {
        establecer_host_pagina(page->url);
        
        page = page->siguiente;
    }
}
/**
 * Metodo para bajar con FIFO
 * @param pagina www.pagina.com/inicio.htm
 */
void bajar_FIFO(char *host, char *page)
{
    printf("bajar host: %s\n", host);
    printf("bajar pagina: %s\n", page);
    
    //Archivo para guardar la pagina
    FILE *archivo;/*El manejador de archivo*/
/*
    char *path = strcat(carpeta, page);
    printf("%s", path);
*/
    archivo = fopen(page, "w");
    //Socket
    struct sockaddr_in *remote;
    int sock;
    int tmpres;
    char *ip;
    char *get;
    char buf[BUFSIZ+1];
    
    //(char *) param
    //host = (char*)args;
    
    if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
        perror("No puede crear el socket TCP");
        //exit(1);
    }
    ip = get_ip(host);
    //fprintf(stderr, "IP is %s\n", ip);
    remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));
    remote->sin_family = AF_INET;
    tmpres = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));

    if(tmpres < 0){
        perror("No se puede configuar");
        exit(1);
    }else if(tmpres == 0){
        fprintf(stderr, "%s No es una direccion IP valida\n", ip);
        exit(1);
    }
    remote->sin_port = htons(PORT);
    //Conectar la pagina
    if(connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0){
        perror("No se puede conectar");
        exit(1);
    }
    get = build_get_query(host, page);
    //fprintf(stderr, "\n<<START>>\n%s<<END>>\n", get);

    //Envia la solicitud al servidor
    int sent = 0;
    while(sent < strlen(get))
    {
        tmpres = send(sock, get + sent, strlen(get) - sent, 0);
        if(tmpres == -1){
            perror("No se puede enviar la solicitud");
            exit(1);
        }
        sent += tmpres;
    }
   
    memset(buf, 0, sizeof(buf));
    int htmlstart = 0;
    char *htmlcontent;
     //Recibe la pagina
    while((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
    {
        if(htmlstart == 0){
            htmlcontent = strstr(buf, "\r\n\r\n");
            if(htmlcontent != NULL){
                htmlstart = 1;
                htmlcontent += 4;
            }
        }else{
            htmlcontent = buf;
        }
/*
        if(htmlstart){
            fprintf(stdout, "%s", htmlcontent);
        }
*/
        fprintf(archivo, "%s", htmlcontent);/*Escribimos en el archivo*/

        memset(buf, 0, tmpres);
    }
    
    if(tmpres < 0){
        perror("Error recibiendo datos");
    }
    
    free(get);
    free(remote);
    free(ip);
    fclose(archivo);
    close(sock);
}

/*
void pagina_separad(char *url)
{
    URL url_split = pagina_separada(url);
    bajar_FIFO(url_split.host, url_split.page);
}
*/
/**
 * Descarga la pagina
 * @param URL
 * @param profundidad
 * @return
 */
void establecer_host_pagina(char *url)
{
    char *result;
    char newURL[strlen(url) + 1];
    strcpy(newURL, url);
    result = strtok(newURL, "/");
    
    char* h, *p;
    int cont = 0;
    char *init;
    init = result;
    
    //Aqui se revisa si la pagina empieza con http o no
    while( result != NULL )
    {
        if(strcmp(init, "http:") != 0 && cont == 0)
        {
            h = result;
        }
        else if(cont == 0)
        {
            result = strtok( NULL, "/");
            h = result;   
        }
        
        result = strtok( NULL, "/");
        if(result != NULL)
        {
            p = result;
        }
        cont++;
    }
    printf("BAJAR PAGINA %s\n", p);
    
    
    imprimir();
/*
    PAGE *pagina = malloc(sizeof(PAGE));
    pagina = get_head();
    
    while(pagina)
    {
        printf("+%s\n", pagina->url);
        pagina = pagina->siguiente;
    }
*/
    
    //LLAMA BAJAR
    //bajar_FIFO(h, p);
}

int main()
{    
    //iniciar_FIFO("http://www.aldia.cr/ad_ee/2011/octubre/01/deportes.html");
    parserHTML("deportes.html");
    //imprimir();
    /*La propia función main es un thread
    /*inicializa los parámetros de los threads por defecto*/
   
    //bajar_THREAD("http://www.web-source.net/html_codes_chart.htm");
    

    //leer_archivos();
    return 1;
}
